#include <stdio.h>

// 定义函数指针类型 PTR_TO_FUN，指向接收两个 int 参数并返回 int 的函数
typedef int (*PTR_TO_FUN)(int, int);

// 函数声明
int add(int, int);
int sub(int, int);

//int calc(int (*)(int, int), int, int);
////int (*select(char))(int, int);

int calc(PTR_TO_FUN, int, int);
PTR_TO_FUN select(char);

// 定义加法函数
int add(int num1, int num2)
{
    return num1 + num2;
}

// 定义减法函数
int sub(int num1, int num2)
{
    return num1 - num2;
}

// calc 函数使用函数指针调用相应的函数
calc(PTR_TO_FUN fp, int num1, int num2)
{
    return (*fp)(num1, num2);
}

// select 函数根据操作符返回指向对应的函数指针
PTR_TO_FUN select(char op)
{
    switch (op)
    {
        case '+': return add; // 返回加法函数指针
        case '-': return sub; // 返回减法函数指针
        default: return NULL; // 如果操作符无效，返回 NULL
    }
}

// 主函数，接受用户输入并输出结果
int main()
{
    int num1, num2;
    char op;
    int (*fp)(int, int); // 定义一个函数指针

    // 用户输入格式如 1+3
    printf("请输入一个式子(如1+3)：");
    scanf("%d%c%d", &num1, &op, &num2);

    // 使用 select 函数选择适当的操作函数
    fp = select(op);

    // 如果函数指针有效，进行计算并输出结果
    if (fp != NULL)
    {
	int result = calc(fp, num1, num2);
        printf("%d %c %d = %d\n", num1, op, num2, calc(fp, num1, num2));
    }
    else
    {
        printf("无效的操作符！\n");
    }

    return 0;
}
